Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.11.2014, 15:00
Новичок на форуме
Отправить личное сообщение для Webnode Посмотреть профиль Найти все сообщения от Webnode
 
Регистрация: 12.01.2014
Сообщений: 6

Node & Websockets - посылка значений в бесконечном цикле
День добрый!

В JS и прочих ЯВУ писал ранее только линейно, Node стал испытанием при решении простейшей задачки:

1. Пользователь открывает рамочную страницу, при установке коннекта через WS ему дают первую порцию данных из базы (getValuesFull). На той стороне данные парсят и выводят.

2. Каждые пять секунд вычисляется разница на стороне сервера и передается через WS в браузер эта самая дельта(getValues). В клиенте данные парсятся и выводятся как и в п.1

Это всё что надо, только одна функция у WS.

Опостылевший пожалуй уже всем пример чата запилил под себя, mysql подсоединил, написал процедуры и сделал кнопку "обновить" в браузере(была в примерчике "Отправить"), при её нажатии всё прилетает как надо.

В конце кода в комментариях моё видение вопроса с бесконечным циклом, но оно не работает, либо сразу в цикл, либо +1 клиент и тоже туда и выхода нет оттуда, обновления не ходят и лог не пишет.

Подскажите, как эту кнопку "нажимать" на сервере каждые 5 секунд, а то если все клиенты будут со стороны браузера дергать будет совсем некрасиво и тяжело для базы.

Заранее спасибо!

var WebSocketServer = new require('ws');

// подключенные клиенты
var clients = {};
var clientsCount = 0;
var mysql =  require('mysql');
var mysqlConnection =  mysql.createConnection({
      database : '***',
      user     : '***',
      password : '***',
      stringifyObjects : true,
      socketPath : '/tmp/mysql.sock'
});

// WebSocket-сервер на порту 8081
var webSocketServer = new WebSocketServer.Server({port: 8081});
webSocketServer.on('connection', function(ws) {
  var id = Math.random();
  clients[id] = ws;
  clientsCount++;
  console.log("new connect " + id + ', total ' + clientsCount);
  getValuesFull(sendBroadcast);

  ws.on('message', function(message) {
    getValues(sendBroadcast);
  });

  ws.on('close', function() {
    clientsCount--;
    console.log('connection is closed ' + id + ', total ' + clientsCount);
    delete clients[id];
  });
});


function sendBroadcast(newValues_){
  for(var key in clients) {
    clients[key].send(newValues_);
  };
};

function getValues(callback){
strQuery = "call getValues";
mysqlConnection.query( strQuery, function(err, rows){
	if(err)	{
		throw err;
	}else{
	        try{
			callback(rows[0][0]['value']);
		}catch(e){
		}
	}
});
};

function getValuesFull(callback){
strQuery = "call getValuesFull";
mysqlConnection.query( strQuery, function(err, rows){
	if(err)	{
		throw err;
	}else{
	        try{
			callback(rows[0][0]['value']);
		}catch(e){
		}
	}
});
};

function sleep(milliSeconds) {
  var startTime = new Date().getTime();
  while (new Date().getTime() < startTime + milliSeconds);
};


//while(1){
//if(clientsCount){
//	getValues(sendBroadcast);
//	sleep(5000);
//};
//};
Ответить с цитированием
  #2 (permalink)  
Старый 04.11.2014, 15:10
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,596

setTimeout\setInterval
Судя по всему вы пока не разбираетесь в самой парадигме js, зачем вам node?
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 04.11.2014, 15:27
Новичок на форуме
Отправить личное сообщение для Webnode Посмотреть профиль Найти все сообщения от Webnode
 
Регистрация: 12.01.2014
Сообщений: 6

Пробовал и так, получал на первом же интервале ошибку:

setInterval(getValues(sendBroadcast), 5000);


new connect 0.09275826113298535, total 1

timers.js:261
callback.apply(this, args);
^
TypeError: Cannot call method 'apply' of undefined
at wrapper [as _onTimeout] (timers.js:261:14)
at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

Как таковой Node не нужен, гуру в нём становится мне поздно, просто решение вопроса на нём наиболее простое на мой взгляд, масса модулей для расширения функционала.

Есть ли у вас пример именно чарта/графика/диаграммы обновлямый с сервера?
Ответить с цитированием
  #4 (permalink)  
Старый 04.11.2014, 15:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,596

Само собой. Вы пихаете в setInterval значение возвращённое функцией getValues(sendBroadcast). В вашем случае функция ничего не возвращает, получается undefined. Т.е. то, что вы написали эквивалентно:
setInterval(undefined, 5000);
Следует завернуть в анонимную функцию:
setInterval(function(){
   getValues(sendBroadcast)
}, 5000);
или, если передача параметра не требуется, то передавать саму функцию:
setInterval(getValues, 5000);

Это тоже вопрос понимания самого базового javascript, безотносительно к конкретным node и setInterval.

Пишите на php, если привыкли - там давно имеются библиотеки для работы с вебсокетами, да и с хостингом куда проще.
__________________
29375, 35

Последний раз редактировалось Aetae, 04.11.2014 в 15:44.
Ответить с цитированием
  #5 (permalink)  
Старый 04.11.2014, 16:31
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Если проблема с пониманием колбеков, то ...

В ES7 добавят async и await, а пока можно юзать похожий функционал на генераторах:

https://www.npmjs.org/package/co

co(function *(){
  var a = yield get('http://google.com');
  var b = yield get('http://yahoo.com');
  var c = yield get('http://cloudup.com');
  console.log(a[0].statusCode);
  console.log(b[0].statusCode);
  console.log(c[0].statusCode);
})()


Всё асинхронно, но никаких колбеков и нормальная обработка ошибок
__________________
kobezzza
code monkey
Ответить с цитированием
  #6 (permalink)  
Старый 04.11.2014, 16:44
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,596

kobezzza, ну не знаю, мож конечно тому кто привык к "обычным" языкам, это и будет сразу удобно и понятно, но имхо скорее окончательно снесёт крышу.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 04.11.2014, 16:50
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Aetae Посмотреть сообщение
kobezzza, ну не знаю, мож конечно тому кто привык к "обычным" языкам, это и будет сразу удобно и понятно, но имхо скорее окончательно снесёт крышу.
Во многих языках так сделана асинхронность: C#, Go и т.д. т.к. такой подход более удобный, чем колбеки и поэтому в ES7 добавят такую фичу из коробки

async {
  var a = await get('http://google.com');
  var b = await get('http://yahoo.com');
  var c = await get('http://cloudup.com');
  console.log(a[0].statusCode);
  console.log(b[0].statusCode);
  console.log(c[0].statusCode);
}


Как то так
__________________
kobezzza
code monkey
Ответить с цитированием
  #8 (permalink)  
Старый 04.11.2014, 17:08
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

kobezzza,
это очешуенно, на самом деле. Но. Когда? Опять через 1-2 года появится? В ночнушках каких-нибудь. А нам потом код переписывать ;( Опять.
Ответить с цитированием
  #9 (permalink)  
Старый 04.11.2014, 17:14
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Safort Посмотреть сообщение
kobezzza,
это очешуенно, на самом деле. Но. Когда? Опять через 1-2 года появится? В ночнушках каких-нибудь. А нам потом код переписывать ;( Опять.
Судьба у нас такая С другой стороны, в некоторых языках, транслируемых в JS такая штука давно уже есть.
__________________
kobezzza
code monkey
Ответить с цитированием
  #10 (permalink)  
Старый 04.11.2014, 20:19
Новичок на форуме
Отправить личное сообщение для Webnode Посмотреть профиль Найти все сообщения от Webnode
 
Регистрация: 12.01.2014
Сообщений: 6

О, вот это самое толковое объяснение ситуации! Нигде не написано, как именно передавать аргументы в функцию, обёртка обычно рассматривается для функций без аргументов.

Php не использую, считаю недоязыком и свалкой всего и вся, уважаю ASM, Perl, SQL в разных ипостасиях. Да, в те дремучие времена знакомства с JS про асинхронность у него как-то было совсем ничего .

И таки да, благодаря помощи вашей - всё заработало как надо, спасибо!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск